package com.daxidi.cn.aop;

import com.daxidi.cn.annotation.LogAnnotation;
import com.daxidi.cn.utils.JWTUtils;
import com.daxidi.cn.utils.RedisUtils;
import io.jsonwebtoken.Claims;
import lombok.Data;
import org.aspectj.lang.reflect.MethodSignature;
import com.daxidi.cn.entity.Log;
import com.daxidi.cn.entity.Manager;
import com.daxidi.cn.mapper.LogMapper;
import com.daxidi.cn.utils.IPKit;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Date;

@Aspect
@Configuration
public class LogAop {
    @Autowired
    private LogMapper logMapper;
    @Autowired
    private HttpServletRequest request;

    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private HttpServletRequest servletRequest;

    @Around("@annotation(com.daxidi.cn.annotation.LogAnnotation)")
    public Object logAround(ProceedingJoinPoint joinPoint){
        /**
         * 1.获取日志数据
         */
        Log log = new Log();

//        日期
        log.setLogAt(new Date());
//        ip 通过工具类
        String ipAddrByRequest = IPKit.getIpAddrByRequest(request);
        log.setLogIp(ipAddrByRequest);


        /**
         * 操作内容和类型
         * 难点：调用的方法不同 所需要获取到的类型和内容是不同的
         * 自定义注解（定义 类型和内容）
         * 通过切面获取自定义注解中的数据
         *
         * 获取目标方法上的注解 连接点对象
         */
//        1.获取方法签名对象
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//        2.通过方法签名对象获取方法对象
        Method method = signature.getMethod();
//        3.通过方法对象获取方法上的注解
        LogAnnotation annotation = method.getAnnotation(LogAnnotation.class);

        String type = annotation.type().toString();
        log.setLogType(type);
        log.setLogContent(annotation.content());

//        执行时间
        long startTime = System.currentTimeMillis();
        Object result = null;
        try {
            result = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        long endTime = System.currentTimeMillis();

        log.setLogTime( endTime-startTime);
        /**
         * 2.日志信息添加数据库
         */
        String token = request.getHeader("token");
        //        session 用户名
        Claims claim = JWTUtils.getClaim(token);
        //String name = (String) redisUtils.get("manager");
        String name = claim.get("mobile").toString();

        if (name != null) {
            log.setUsername(name);
        }else {
            log.setUsername("未知用户");
        }

        System.out.println(log);
        logMapper.insert(log);
        return result;
    }
}
